package com.ruoyi.framework.security.manager;

import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.ruoyi.common.exception.ServiceException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

/**
 * 微信小程序登录管理
 *
 * @author 10100
 */
@Slf4j
@Component
public class WxMiniAppManager {

    /**
     * 微信小程序appId
     */
    @Value("${wx.appid}")
    private String appid;

    /**
     * 微信小程序secret
     */
    @Value("${wx.secret}")
    private String secret;

    /**
     * 微信授权类型,固定值
     */
    private static final String GRANT_TYPE = "authorization_code";

    /**
     * 获取微信小程序登录后的session信息
     *
     * @param code 微信前端登录传来的code
     * @return openid
     */
    public JSONObject getSessionInfo(String code) {
        String requestUrl = "https://api.weixin.qq.com/sns/jscode2session";
        // 拼接请求参数
        String url = String.format("%s?appid=%s&secret=%s&js_code=%s&grant_type=%s",
                requestUrl, appid, secret, code, GRANT_TYPE);

        // 发送GET请求
        String result = HttpUtil.get(url);
        log.info("微信小程序登录，获取session结果：{}", result);

        // 解析返回结果
        JSONObject jsonObject = JSON.parseObject(result);

        // 获取会话密钥
        String openid = jsonObject.getString("openid");
        String sessionKey = jsonObject.getString("session_key");

        if (StrUtil.isBlank(openid) || StrUtil.isBlank(sessionKey)) {
            throw new ServiceException("微信登录失败，可能是code已过期");
        }

        return jsonObject;
    }
}